Efficient memory management is important for efficient execution of computer programs. Many programming languages support memory management for heap memory. For example, some virtual machine implementations use a fast generational garbage collector that allocates objects from the heap, wherein the allocation streams through memory. Typically, streamed data flushes lines out of the cache and forces extra read operations and write operations. This leads to extra memory traffic and inefficient utilization of caches.
One way of reducing memory traffic is to use stack based allocation for memory management. In systems that support stack based allocation schemes, objects are allocated on the running program's stack instead of a shared heap. The memory is freed when the stack frame exits. Since manual stack allocation requires extensive programmer intervention and is error prone, stack based allocation is typically done automatically. Currently, successful stack based allocation requires accurate knowledge about the lifetime of objects. Such knowledge may be acquired using escape analysis. However, escape analysis is typically an expensive operation performed at compile time, making it impractical for large-scale development efforts. Also, current escape analysis tends to be pessimistic, that is, it tends to limit stack based allocation to those objects that can be proven to be safe to allocate on the stack. Such pessimistic allocation potentially misses a significant number of effective stack based allocation opportunities.
It would be useful to have a memory management technique that would allow for efficient stack based allocation, without incurring the compile time overhead associated with escape analysis. It would also be desirable if the memory management technique could maximize the opportunities for stack based allocation.